/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.apps.dashclock.calendar;
import net.nurik.roman.dashclock.R;
import android.app.AlertDialog.Builder;
import android.content.AsyncQueryHandler;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.database.Cursor;
import android.preference.MultiSelectListPreference;
import android.preference.PreferenceManager;
import android.provider.CalendarContract;
import android.util.AttributeSet;
import android.util.Pair;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CalendarSelectionPreference extends MultiSelectListPreference {
private CalendarListAdapter mAdapter;
private QueryHandler mQueryHandler;
private Set<String> mSelectedCalendars;
public CalendarSelectionPreference(Context context) {
this(context, null);
}
public CalendarSelectionPreference(Context context, AttributeSet attrs) {
super(context, attrs);
List<Pair<String, Boolean>> allCalendars = CalendarExtension.getAllCalendars(context);
Set<String> allVisibleCalendarsSet = new HashSet<String>();
for (Pair<String, Boolean> pair : allCalendars) {
if (pair.second) {
allVisibleCalendarsSet.add(pair.first);
}
}
mSelectedCalendars = new HashSet<String>(PreferenceManager
.getDefaultSharedPreferences(context)
.getStringSet(CalendarExtension.PREF_SELECTED_CALENDARS, allVisibleCalendarsSet));
mAdapter = new CalendarListAdapter(context);
mQueryHandler = new QueryHandler(context, mAdapter);
mQueryHandler.startQuery(0,
null,
CalendarContract.Calendars.CONTENT_URI,
CalendarQuery.PROJECTION,
CalendarContract.Calendars.SYNC_EVENTS + "=1",
null,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME);
}
@Override
protected void onPrepareDialogBuilder(Builder builder) {
builder.setAdapter(mAdapter, null);
builder.setTitle(R.string.pref_calendar_selected_title);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
sp.edit().putStringSet(CalendarExtension.PREF_SELECTED_CALENDARS,
mSelectedCalendars).commit();
// since we have extended the list preference, it is our responsibility to inform the change listener.
if (getOnPreferenceChangeListener() != null) {
getOnPreferenceChangeListener()
.onPreferenceChange(CalendarSelectionPreference.this,
mSelectedCalendars);
}
}
});
}
static class QueryHandler extends AsyncQueryHandler {
private final CalendarListAdapter mAdapter;
public QueryHandler(Context context, CalendarListAdapter adapter) {
super(context.getContentResolver());
mAdapter = adapter;
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
mAdapter.swapCursor(cursor);
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
// No support for default value attribute
return null;
}
public class CalendarListAdapter extends ResourceCursorAdapter {
public CalendarListAdapter(Context context) {
super(context, R.layout.list_item_calendar, null, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView calendarNameView = (TextView) view.findViewById(android.R.id.text1);
calendarNameView.setText(cursor.getString(CalendarQuery.CALENDAR_DISPLAY_NAME));
TextView accountNameView = (TextView) view.findViewById(android.R.id.text2);
accountNameView.setText(cursor.getString(CalendarQuery.ACCOUNT_NAME));
final String calendarId = cursor.getString(CalendarQuery.ID);
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.calendar_checkbox);
checkBox.setChecked(mSelectedCalendars.contains(calendarId));
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedCalendars.contains(calendarId)) {
mSelectedCalendars.remove(calendarId);
checkBox.setChecked(false);
} else {
mSelectedCalendars.add(calendarId);
checkBox.setChecked(true);
}
}
});
}
}
interface CalendarQuery {
public String[] PROJECTION = new String[] {
CalendarContract.Calendars._ID,
CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
CalendarContract.Calendars.ACCOUNT_NAME,
};
public int ID = 0;
public int CALENDAR_DISPLAY_NAME = 1;
public int ACCOUNT_NAME = 2;
}
}